4a Files — one surface, two view filters (变更 / 全部)

The changed-files surface absorbs full workdir browsing instead of gaining a sibling entry. 变更 stays the default and unchanged; 全部 adds the tree (desktop) and a drill-down list (mobile). The two views are stitched by status: files touched this session keep their M/A/D mark everywhere, folders carry a subtree change count, and every row opens the same viewer.

DESKTOP
(a) HAS CHANGES
cc-pocket · fix webpack chunk split ± 3 >_
↑ pill h20 · r5 · pad 0/8 · mono 11/600
(b) ZERO CHANGES
cc-pocket · rate limiter backoff >_
↑ same 26×20 geometry as >_ chip — entry never disappears
CENTERED OVERLAY · 全部 VIEW (shown 860w of max 1040)
文件 ~/proj/cc-pocket
变更3
全部
src 5
ui 3
FilesSheet.kt A
Composer.kt M
SheetScrim.kt D
Theme.kt
net 2
Main.kt
gradle
node_modules
.package-lock.json
已显示前 2000 项,其余已折叠
build.gradle.kts M
README.md
src/ui/FilesSheet.kt A +184 −0
{{ l.n }} {{ l.t }}
tree row h26 · indent step 14 status dot 14×14 r7 · bg tint 16% folder badge h15 r4 · min-w15 segmented h24 r6 · pad 2 · pill r4
INSET · 变更 VIEW (unchanged)
变更3
全部
{{ f.name }}
{{ f.dir }}
{{ f.add }} {{ f.del }} {{ f.s }}
Switching views keeps the selected file and the right pane. Untouched file → right pane shows full text, no diff stat in the header. Hidden-file eye toggle applies to both views and persists per workdir.
MOBILE · 390pt
FILES SHEET · 全部 (DRILL-DOWN)
9:41cc-pocket
文件
变更3
全部
root src ui
components 2
theme
FilesSheet.kt A
Composer.kt M
Theme.kt
Tokens.kt
已显示前 2000 项,其余已折叠
↑ row h44 · breadcrumb h32 · segmented h30 r8 · badge h17 r5 · dot 18×18
FILES SHEET · 变更 (DEFAULT)
⋯ TOOLS SHEET ROW (SOURCE ENTRY)
文件 3 处改动
终端
文件
变更3
全部
{{ f.name }}
{{ f.dir }}
{{ f.add }} {{ f.del }} {{ f.s }}
↑ changed row h56 (two-line) · tools row h48 · grabber 36×4
VIEWER · CHANGED FILE
Composer.kt M
Diff 全文
+ onFilesClick = { open(FilesTab.CHANGES) }
− onFilesClick = { openDiffModal() }
↑ lands on Diff · tab underline 2px #D97757
VIEWER · UNTOUCHED FILE
Theme.kt
Diff 全文
internal object Tokens {
val Surface = Color(0xFF1E2125)
↑ Diff tab disabled #4A4E55 · 全文 active